home *** CD-ROM | disk | FTP | other *** search
/ Games of Daze / Infomagic - Games of Daze (Summer 1995) (Disc 1 of 2).iso / x2ftp / msdos / libs / hobbes3 / triangle.asm < prev   
Assembly Source File  |  1992-08-17  |  18KB  |  736 lines

  1. include hobbes.inc
  2. include extrn.inc
  3.  
  4. EXTRN _HLineClip, _HLineClipR
  5.  
  6. .CODE
  7. ;-----------------------------------------------------------------------
  8. ; void TriangleFill(int X0, int Y0, int X1, int Y1, int X2, int Y2, COLOR);
  9.  
  10.         public  _TriangleFill
  11. _TriangleFill       proc    far
  12. ARG X0:WORD, Y0:WORD, X1:WORD, Y1:WORD, X2:WORD, Y2:WORD, COLOR:WORD
  13. LOCAL DX01:WORD, DY01:WORD, DX02:WORD, DY02:WORD, DX12:WORD, DY12:WORD, \
  14.     DP01:WORD, DP02:WORD, DP12:WORD, XA01:WORD, XA02:WORD, XA12:WORD=LocalStack
  15.         push    bp
  16.         mov     bp,sp
  17.         sub     sp,LocalStack
  18.         push    ds
  19.         push    si
  20.         push    di
  21.  
  22.         mov        ax,@data
  23.         mov        ds,ax
  24.  
  25.         mov     ax,X0
  26.         mov     bx,Y0
  27.         mov     cx,X1
  28.         mov     dx,Y1
  29.  
  30.         cmp     bx,dx   ; Y0,Y1
  31.         jl      @@tri_Y0lY1
  32.         je      @@tri_Y0eY1
  33.         xchg    ax,cx   ; X0,X1
  34.         xchg    bx,dx   ; Y0,Y1
  35. @@tri_Y0lY1:
  36.         cmp     dx,Y2   ; Y1,Y2
  37.         jg      @@tri_a
  38.         jmp     @@tri_sorted
  39. @@tri_a:
  40.         xchg    cx,X2   ; X1,X2
  41.         xchg    dx,Y2   ; Y1,Y2
  42.         cmp     bx,dx   ; Y0,Y1
  43.         jge     @@tri_b
  44.         jmp     @@tri_sorted
  45. @@tri_b:
  46.         je      @@tri_bot
  47.         xchg    ax,cx   ; X0,X1
  48.         xchg    bx,dx   ; Y0,Y1
  49.         jmp     @@tri_sorted
  50. @@tri_Y0eY1:
  51.         cmp     bx,Y2   ; Y0,Y2
  52.         jl      @@tri_bot
  53.         jg      @@tri_c
  54.         jmp     @@tri_done
  55. @@tri_c:
  56.         xchg    ax,X2   ; X0,X2
  57.         xchg    bx,Y2   ; Y0,Y2
  58.         jmp     @@tri_sorted
  59.  
  60. @@tri_bot:
  61.         cmp     ax,cx   ; X0,X1
  62.         jl      @@tri_bot_sorted
  63.         jg      @@tri_bot_a
  64.         jmp     @@tri_done
  65. @@tri_bot_a:
  66.         xchg    ax,cx   ; X0,X1
  67. @@tri_bot_sorted:
  68.         cmp     bx,_ClipBottom
  69.         jle     @@tri_bot_y0ok
  70.         jmp     @@tri_done
  71. @@tri_bot_y0ok:
  72.         mov     si,Y2
  73.         cmp     si,_ClipTop
  74.         jge     @@tri_bot_y2ok
  75.         jmp     @@tri_done
  76. @@tri_bot_y2ok:
  77.         mov     X0,ax
  78.         mov     Y0,bx
  79.         mov     X1,cx
  80.         mov     Y1,dx
  81.  
  82.         mov     bx,Y2   ;    bx <- Y2
  83.         sub     bx,Y0   ;    bx <- Y2 - Y0
  84.         mov     DY02,bx ;  DY02 <- Y2 - Y0
  85.         mov     ax,X2   ;    ax <- X2
  86.         sub     ax,X0   ;    ax <- X2 - X0
  87.         mov     DX02,ax ;  DX02 <- X2 - X0
  88.         mov     cx,ax   ;    cx <- DX02
  89.         cwd             ; dx:ax <- DX02
  90.         idiv    bx      ;    ax <- DX02 / DY02
  91.         cmp     cx,0
  92.         jge     short @@tri_bot02
  93.         dec     ax      ;    ax <- DX02 / DY02 - 1
  94. @@tri_bot02:
  95.         mov     XA02,ax ;  XA02 <- DX02 / DY02
  96.         imul    bx      ;    ax <- XA02 * DY02
  97.         sub     cx,ax   ;    cx <- DX02 - XA02 * DY02
  98.         mov     DP02,cx ;  DP02 <- DX02 - XA02 * DY02
  99.  
  100.         mov     bx,Y2   ;    bx <- Y2
  101.         sub     bx,Y1   ;    bx <- Y2 - Y1
  102.         mov     DY12,bx ;  DY02 <- Y2 - Y1
  103.         mov     ax,X2   ;    ax <- X2
  104.         sub     ax,X1   ;    ax <- X2 - X1
  105.         mov     DX12,ax ;  DX12 <- X2 - X1
  106.         mov     cx,ax   ;    cx <- DX12
  107.         cwd             ; dx:ax <- DX12
  108.         idiv    bx      ;    ax <- DX12 / DY12
  109.         cmp     cx,0
  110.         jge     short @@tri_bot12
  111.         dec     ax      ;    ax <- DX12 / DY12 - 1
  112. @@tri_bot12:
  113.         mov     XA12,ax ;  XA12 <- DX12 / DY12
  114.         imul    bx      ;    ax <- XA12 * DY12
  115.         sub     cx,ax   ;    cx <- DX12 - XA12 * DY12
  116.         mov     DP12,cx ;  DP12 <- DX12 - XA12 * DY12
  117.  
  118.         mov     ax,0    ; PL <- 0
  119.         mov     bx,0    ; PS <- 0
  120.         mov     cx,Y0   ;  Y <- Y0
  121.         mov     si,X0
  122.         mov     di,X1
  123.         dec     di
  124. @@tri_bot_loop:
  125.         inc     cx      ; Y
  126.  
  127.         add     ax,DP02 ; PL,DP02
  128.         jle     short @@tri_bot_shortl
  129.         sub     ax,DY02 ; PL,DY02
  130.         inc     si      ; XL
  131. @@tri_bot_shortl:
  132.         add     si,XA02 ; XL,XA02
  133.  
  134.         add     bx,DP12 ; PS,DP12
  135.         jle     short @@tri_bot_shortr
  136.         sub     bx,DY12 ; PS,DY12
  137.         inc     di      ; XS
  138. @@tri_bot_shortr:
  139.         add     di,XA12 ; XS,XA12
  140.  
  141.         push    di      ; XS
  142.         push    si      ; XL
  143.         cmp     cx,Y2   ; Y,Y2
  144.         jl      short @@tri_bot_loop
  145.  
  146.         jmp     @@tri_draw_lines
  147.  
  148.  
  149. @@tri_sorted:
  150.         cmp     bx,_ClipBottom
  151.         jle     @@tri_y0ok
  152.         jmp     @@tri_done
  153. @@tri_y0ok:
  154.         mov     si,Y2
  155.         cmp     si,_ClipTop
  156.         jge     @@tri_y2ok
  157.         jmp     @@tri_done
  158. @@tri_y2ok:
  159.         mov     X0,ax
  160.         mov     Y0,bx
  161.         mov     X1,cx
  162.         mov     Y1,dx
  163.  
  164.         mov     bx,dx   ;    bx <- Y1
  165.         sub     bx,Y0   ;    bx <- Y1 - Y0
  166.         mov     DY01,bx ;  DY01 <- Y1 - Y0
  167.         mov     ax,X1   ;    ax <- X1
  168.         sub     ax,X0   ;    ax <- X1 - X0
  169.         mov     DX01,ax ;  DX01 <- X1 - X0
  170.         mov     cx,ax   ;    cx <- DX01
  171.         cwd             ; dx:ax <- DX01
  172.         idiv    bx      ;    ax <- DX01 / DY01
  173.         cmp     cx,0    ;  DX01 ? 0
  174.         jge     short @@tri_psl01
  175.         dec     ax      ;    ax <- DX01 / DY01 - 1
  176. @@tri_psl01:
  177.         mov     XA01,ax ;  XA01 <- DX01 / DY01
  178.         imul    bx      ;    ax <- XA01 * DY01
  179.         sub     cx,ax   ;    cx <- DX01 - XA01 * DY01
  180.         mov     DP01,cx ;  DP01 <- DX01 - XA01 * DY01
  181.  
  182.         mov     bx,Y2   ;    bx <- Y2
  183.         sub     bx,Y0   ;    bx <- Y2 - Y0
  184.         mov     DY02,bx ;  DY02 <- Y2 - Y0
  185.         mov     ax,X2   ;    ax <- X2
  186.         sub     ax,X0   ;    ax <- X2 - X0
  187.         mov     DX02,ax ;  DX02 <- X2 - X0
  188.         mov     cx,ax   ;    cx <- DX02
  189.         cwd             ; dx:ax <- DX02
  190.         idiv    bx      ;    ax <- DX02 / DY02
  191.         cmp     cx,0
  192.         jge     short @@tri_psl02
  193.         dec     ax      ;    ax <- DX02 / DY02 - 1
  194. @@tri_psl02:
  195.         mov     XA02,ax ;  XA02 <- DX02 / DY02
  196.         imul    bx      ;    ax <- XA02 * DY02
  197.         sub     cx,ax   ;    cx <- DX02 - XA02 * DY02
  198.         mov     DP02,cx ;  DP02 <- DX02 - XA02 * DY02
  199.  
  200.         mov     bx,Y2   ;    bx <- Y2
  201.         sub     bx,Y1   ;    bx <- Y2 - Y1
  202.         jle     short @@tri_const_computed
  203.         mov     DY12,bx ;  DY12 <- Y2 - Y1
  204.         mov     ax,X2   ;    ax <- X2
  205.         sub     ax,X1   ;    ax <- X2 - X1
  206.         mov     DX12,ax ;  DX12 <- X2 - X1
  207.         mov     cx,ax   ;    cx <- DX12
  208.         cwd             ; dx:ax <- DX12
  209.         idiv    bx      ;    ax <- DX12 / DY12
  210.         cmp     cx,0
  211.         jge     short @@tri_psl12
  212.         dec     ax      ;    ax <- DX12 / DY12 - 1
  213. @@tri_psl12:
  214.         mov     XA12,ax ;  XA12 <- DX12 / DY12
  215.         imul    bx      ;    ax <- XA12 * DY12
  216.         sub     cx,ax   ;    cx <- DX12 - XA12 * DY12
  217.         mov     DP12,cx ;  DP12 <- DX12 - XA12 * DY12
  218.  
  219. @@tri_const_computed:
  220.         mov     ax,DX01
  221.         imul    word ptr DY02
  222.         mov     bx,ax
  223.         mov     cx,dx   ; DX01 * DY02 in cx:bx
  224.  
  225.         mov     ax,DX02
  226.         imul    word ptr DY01 ; DX02 * DY01 in dx:ax
  227.         cmp     cx,dx
  228.         jg      @@tri_pt1rt
  229.         jl      @@tri_pt1lt
  230.         cmp     bx,ax
  231.         ja      @@tri_pt1rt
  232.         jb      @@tri_pt1lt
  233.         jmp     @@tri_done
  234.  
  235. ; Short sides are on the left
  236. ;
  237. @@tri_pt1lt:
  238.         mov     ax,0    ; PL <- 0
  239.         mov     bx,0    ; PS <- 0
  240.         mov     cx,Y0   ;  Y <- Y0
  241.         mov     si,X0
  242.         mov     di,si
  243.         dec     si
  244. @@tri_lt_loop:
  245.         inc     cx      ; Y
  246.  
  247.         add     ax,DP02 ; PL,DP02
  248.         jle     short @@tri_lt_shortl
  249.         sub     ax,DY02 ; PL,DY02
  250.         inc     si      ; XL
  251. @@tri_lt_shortl:
  252.         add     si,XA02 ; XL,XA02
  253.  
  254.         add     bx,DP01 ; PS,DP01
  255.         jle     short @@tri_lt_shortr
  256.         sub     bx,DY01 ; PS,DY01
  257.         inc     di      ; XS
  258. @@tri_lt_shortr:
  259.         add     di,XA01 ; XS,XA01
  260.  
  261.         push    si      ; XL
  262.         push    di      ; XS
  263.         cmp     cx,Y1   ; Y,Y1
  264.         jl      short @@tri_lt_loop
  265.  
  266.         jmp     short @@tri_lb_start
  267. @@tri_lb_loop:
  268.         inc     cx      ; Y
  269.  
  270.         add     ax,DP02 ; PL,DP02
  271.         jle     short @@tri_lb_shortl
  272.         sub     ax,DY02 ; PL,DY02
  273.         inc     si      ; XL
  274. @@tri_lb_shortl:
  275.         add     si,XA02 ; XL,XA02
  276.  
  277.         add     bx,DP12 ; PS,DP12
  278.         jle     short @@tri_lb_shortr
  279.         sub     bx,DY12 ; PS,DY12
  280.         inc     di      ; XS
  281. @@tri_lb_shortr:
  282.         add     di,XA12 ; XS,XA12
  283.  
  284.         push    si      ; XL
  285.         push    di      ; XS
  286. @@tri_lb_start:
  287.         cmp     cx,Y2   ; Y,Y2
  288.         jl      @@tri_lb_loop
  289.         jmp     short @@tri_draw_lines
  290.  
  291. ; short sides are on the right
  292. ;
  293. @@tri_pt1rt:
  294.         mov     ax,0    ; PL <- 0
  295.         mov     bx,0    ; PS <- 0
  296.         mov     cx,Y0   ;  Y <- Y0
  297.         mov     si,X0
  298.         mov     di,si
  299.         dec     di
  300. @@tri_rt_loop:
  301.         inc     cx      ; Y
  302.  
  303.         add     ax,DP02 ; PL,DP02
  304.         jle     short @@tri_rt_shortl
  305.         sub     ax,DY02 ; PL,DY02
  306.         inc     si      ; XL
  307. @@tri_rt_shortl:
  308.         add     si,XA02 ; XL,XA02
  309.  
  310.         add     bx,DP01 ; PS,DP01
  311.         jle     short @@tri_rt_shortr
  312.         sub     bx,DY01 ; PS,DY01
  313.         inc     di      ; XS
  314. @@tri_rt_shortr:
  315.         add     di,XA01 ; XS,XA01
  316.  
  317.         push    di      ; XS
  318.         push    si      ; XL
  319.         cmp     cx,Y1   ; Y,Y1
  320.         jl      short @@tri_rt_loop
  321.  
  322.         jmp     short @@tri_rb_start
  323. @@tri_rb_loop:
  324.         inc     cx      ; Y
  325.  
  326.         add     ax,DP02 ; PL,DP02
  327.         jle     short @@tri_rb_shortl
  328.         sub     ax,DY02 ; PL,DY02
  329.         inc     si      ; XL
  330. @@tri_rb_shortl:
  331.         add     si,XA02 ; XL,XA02
  332.  
  333.         add     bx,DP12 ; PS,DP12
  334.         jle     short @@tri_rb_shorts
  335.         sub     bx,DY12 ; PS,DY12
  336.         inc     di      ; XS
  337. @@tri_rb_shorts:
  338.         add     di,XA12 ; XS,XA12
  339.  
  340.         push    di      ; XS
  341.         push    si      ; XL
  342. @@tri_rb_start:
  343.         cmp     cx,Y2   ; Y,Y2
  344.         jl      short @@tri_rb_loop
  345.  
  346. ; Draw the horizontal lines
  347. ;
  348. @@tri_draw_lines:
  349.         pop     ax
  350.         pop     dx
  351.         cmp     ax,dx
  352.         jg      @@tri_draw_next
  353.         mov     bx,COLOR
  354.         mov     cx,Y2
  355.         call    far ptr _HLineClipR
  356. @@tri_draw_next:
  357.         dec     word ptr Y2
  358.         dec     word ptr DY02
  359.         jnz     @@tri_draw_lines
  360.  
  361. @@tri_done:
  362.         pop     di
  363.         pop     si
  364.         pop     ds
  365.         mov     sp,bp
  366.         pop     bp
  367.         ret
  368. _TriangleFill       endp
  369.  
  370.  
  371.  
  372.  
  373.  
  374.  
  375. ;----------------------------------------------------------------------------
  376. ; void TriangleFillClip(int X0, int Y0, int X1, int Y1, int X2, int Y2, COLOR);
  377.  
  378.         public  _TriangleFillClip
  379. _TriangleFillClip   proc    far
  380. ARG X0:WORD, Y0:WORD, X1:WORD, Y1:WORD, X2:WORD, Y2:WORD, COLOR:WORD
  381. LOCAL DX01:WORD, DY01:WORD, DX02:WORD, DY02:WORD, DX12:WORD, DY12:WORD, \
  382.     DP01:WORD, DP02:WORD, DP12:WORD, XA01:WORD, XA02:WORD, XA12:WORD=LocalStack
  383.         push    bp
  384.         mov     bp,sp
  385.         sub     sp,LocalStack
  386.         push    ds
  387.         push    si
  388.         push    di
  389.  
  390.         mov     ax,X0
  391.         mov     bx,Y0
  392.         mov     cx,X1
  393.         mov     dx,Y1
  394.  
  395.         cmp     bx,dx   ; Y0,Y1
  396.         jl      @@ctri_Y0lY1
  397.         je      @@ctri_Y0eY1
  398.         xchg    ax,cx   ; X0,X1
  399.         xchg    bx,dx   ; Y0,Y1
  400. @@ctri_Y0lY1:
  401.         cmp     dx,Y2   ; Y1,Y2
  402.         jg      @@ctri_a
  403.         jmp     @@ctri_sorted
  404. @@ctri_a:
  405.         xchg    cx,X2   ; X1,X2
  406.         xchg    dx,Y2   ; Y1,Y2
  407.         cmp     bx,dx   ; Y0,Y1
  408.         jge     @@ctri_b
  409.         jmp     @@ctri_sorted
  410. @@ctri_b:
  411.         je      @@ctri_bot
  412.         xchg    ax,cx   ; X0,X1
  413.         xchg    bx,dx   ; Y0,Y1
  414.         jmp     @@ctri_sorted
  415. @@ctri_Y0eY1:
  416.         cmp     bx,Y2   ; Y0,Y2
  417.         jl      @@ctri_bot
  418.         jg      @@ctri_c
  419.         jmp     @@ctri_done
  420. @@ctri_c:
  421.         xchg    ax,X2   ; X0,X2
  422.         xchg    bx,Y2   ; Y0,Y2
  423.         jmp     @@ctri_sorted
  424.  
  425. @@ctri_bot:
  426.         cmp     ax,cx   ; X0,X1
  427.         jl      @@ctri_bot_sorted
  428.         jg      @@ctri_bot_a
  429.         jmp     @@ctri_done
  430. @@ctri_bot_a:
  431.         xchg    ax,cx   ; X0,X1
  432. @@ctri_bot_sorted:
  433.         cmp     bx,_ClipBottom
  434.         jle     @@ctri_bot_y0ok
  435.         jmp     @@ctri_done
  436. @@ctri_bot_y0ok:
  437.         mov     si,Y2
  438.         cmp     si,_ClipTop
  439.         jge     @@ctri_bot_y2ok
  440.         jmp     @@ctri_done
  441. @@ctri_bot_y2ok:
  442.         mov     X0,ax
  443.         mov     Y0,bx
  444.         mov     X1,cx
  445.         mov     Y1,dx
  446.  
  447.         mov     bx,Y2   ;    bx <- Y2
  448.         sub     bx,Y0   ;    bx <- Y2 - Y0
  449.         mov     DY02,bx ;  DY02 <- Y2 - Y0
  450.         mov     ax,X2   ;    ax <- X2
  451.         sub     ax,X0   ;    ax <- X2 - X0
  452.         mov     DX02,ax ;  DX02 <- X2 - X0
  453.         mov     cx,ax   ;    cx <- DX02
  454.         cwd             ; dx:ax <- DX02
  455.         idiv    bx      ;    ax <- DX02 / DY02
  456.         cmp     cx,0
  457.         jge     short @@ctri_bot02
  458.         dec     ax      ;    ax <- DX02 / DY02 - 1
  459. @@ctri_bot02:
  460.         mov     XA02,ax ;  XA02 <- DX02 / DY02
  461.         imul    bx      ;    ax <- XA02 * DY02
  462.         sub     cx,ax   ;    cx <- DX02 - XA02 * DY02
  463.         mov     DP02,cx ;  DP02 <- DX02 - XA02 * DY02
  464.  
  465.         mov     bx,Y2   ;    bx <- Y2
  466.         sub     bx,Y1   ;    bx <- Y2 - Y1
  467.         mov     DY12,bx ;  DY02 <- Y2 - Y1
  468.         mov     ax,X2   ;    ax <- X2
  469.         sub     ax,X1   ;    ax <- X2 - X1
  470.         mov     DX12,ax ;  DX12 <- X2 - X1
  471.         mov     cx,ax   ;    cx <- DX12
  472.         cwd             ; dx:ax <- DX12
  473.         idiv    bx      ;    ax <- DX12 / DY12
  474.         cmp     cx,0
  475.         jge     short @@ctri_bot12
  476.         dec     ax      ;    ax <- DX12 / DY12 - 1
  477. @@ctri_bot12:
  478.         mov     XA12,ax ;  XA12 <- DX12 / DY12
  479.         imul    bx      ;    ax <- XA12 * DY12
  480.         sub     cx,ax   ;    cx <- DX12 - XA12 * DY12
  481.         mov     DP12,cx ;  DP12 <- DX12 - XA12 * DY12
  482.  
  483.         mov     ax,0    ; PL <- 0
  484.         mov     bx,0    ; PS <- 0
  485.         mov     cx,Y0   ;  Y <- Y0
  486.         mov     si,X0
  487.         mov     di,X1
  488.         dec     di
  489. @@ctri_bot_loop:
  490.         inc     cx      ; Y
  491.  
  492.         add     ax,DP02 ; PL,DP02
  493.         jle     short @@ctri_bot_shortl
  494.         sub     ax,DY02 ; PL,DY02
  495.         inc     si      ; XL
  496. @@ctri_bot_shortl:
  497.         add     si,XA02 ; XL,XA02
  498.  
  499.         add     bx,DP12 ; PS,DP12
  500.         jle     short @@ctri_bot_shortr
  501.         sub     bx,DY12 ; PS,DY12
  502.         inc     di      ; XS
  503. @@ctri_bot_shortr:
  504.         add     di,XA12 ; XS,XA12
  505.  
  506.         push    di      ; XS
  507.         push    si      ; XL
  508.         cmp     cx,Y2   ; Y,Y2
  509.         jl      short @@ctri_bot_loop
  510.  
  511.         jmp     @@ctri_draw_lines
  512.  
  513.  
  514. @@ctri_sorted:
  515.         cmp     bx,_ClipBottom
  516.         jle     @@ctri_y0ok
  517.         jmp     @@ctri_done
  518. @@ctri_y0ok:
  519.         mov     si,Y2
  520.         cmp     si,_ClipTop
  521.         jge     @@ctri_y2ok
  522.         jmp     @@ctri_done
  523. @@ctri_y2ok:
  524.         mov     X0,ax
  525.         mov     Y0,bx
  526.         mov     X1,cx
  527.         mov     Y1,dx
  528.  
  529.         mov     bx,dx   ;    bx <- Y1
  530.         sub     bx,Y0   ;    bx <- Y1 - Y0
  531.         mov     DY01,bx ;  DY01 <- Y1 - Y0
  532.         mov     ax,X1   ;    ax <- X1
  533.         sub     ax,X0   ;    ax <- X1 - X0
  534.         mov     DX01,ax ;  DX01 <- X1 - X0
  535.         mov     cx,ax   ;    cx <- DX01
  536.         cwd             ; dx:ax <- DX01
  537.         idiv    bx      ;    ax <- DX01 / DY01
  538.         cmp     cx,0    ;  DX01 ? 0
  539.         jge     short @@ctri_psl01
  540.         dec     ax      ;    ax <- DX01 / DY01 - 1
  541. @@ctri_psl01:
  542.         mov     XA01,ax ;  XA01 <- DX01 / DY01
  543.         imul    bx      ;    ax <- XA01 * DY01
  544.         sub     cx,ax   ;    cx <- DX01 - XA01 * DY01
  545.         mov     DP01,cx ;  DP01 <- DX01 - XA01 * DY01
  546.  
  547.         mov     bx,Y2   ;    bx <- Y2
  548.         sub     bx,Y0   ;    bx <- Y2 - Y0
  549.         mov     DY02,bx ;  DY02 <- Y2 - Y0
  550.         mov     ax,X2   ;    ax <- X2
  551.         sub     ax,X0   ;    ax <- X2 - X0
  552.         mov     DX02,ax ;  DX02 <- X2 - X0
  553.         mov     cx,ax   ;    cx <- DX02
  554.         cwd             ; dx:ax <- DX02
  555.         idiv    bx      ;    ax <- DX02 / DY02
  556.         cmp     cx,0
  557.         jge     short @@ctri_psl02
  558.         dec     ax      ;    ax <- DX02 / DY02 - 1
  559. @@ctri_psl02:
  560.         mov     XA02,ax ;  XA02 <- DX02 / DY02
  561.         imul    bx      ;    ax <- XA02 * DY02
  562.         sub     cx,ax   ;    cx <- DX02 - XA02 * DY02
  563.         mov     DP02,cx ;  DP02 <- DX02 - XA02 * DY02
  564.  
  565.         mov     bx,Y2   ;    bx <- Y2
  566.         sub     bx,Y1   ;    bx <- Y2 - Y1
  567.         jle     short @@ctri_const_computed
  568.         mov     DY12,bx ;  DY12 <- Y2 - Y1
  569.         mov     ax,X2   ;    ax <- X2
  570.         sub     ax,X1   ;    ax <- X2 - X1
  571.         mov     DX12,ax ;  DX12 <- X2 - X1
  572.         mov     cx,ax   ;    cx <- DX12
  573.         cwd             ; dx:ax <- DX12
  574.         idiv    bx      ;    ax <- DX12 / DY12
  575.         cmp     cx,0
  576.         jge     short @@ctri_psl12
  577.         dec     ax      ;    ax <- DX12 / DY12 - 1
  578. @@ctri_psl12:
  579.         mov     XA12,ax ;  XA12 <- DX12 / DY12
  580.         imul    bx      ;    ax <- XA12 * DY12
  581.         sub     cx,ax   ;    cx <- DX12 - XA12 * DY12
  582.         mov     DP12,cx ;  DP12 <- DX12 - XA12 * DY12
  583.  
  584. @@ctri_const_computed:
  585.         mov     ax,DX01
  586.         imul    word ptr DY02
  587.         mov     bx,ax
  588.         mov     cx,dx   ; DX01 * DY02 in cx:bx
  589.  
  590.         mov     ax,DX02
  591.         imul    word ptr DY01 ; DX02 * DY01 in dx:ax
  592.         cmp     cx,dx
  593.         jg      @@ctri_pt1rt
  594.         jl      @@ctri_pt1lt
  595.         cmp     bx,ax
  596.         ja      @@ctri_pt1rt
  597.         jb      @@ctri_pt1lt
  598.         jmp     @@ctri_done
  599.  
  600. ; Short sides are on the left
  601. ;
  602. @@ctri_pt1lt:
  603.         mov     ax,0    ; PL <- 0
  604.         mov     bx,0    ; PS <- 0
  605.         mov     cx,Y0   ;  Y <- Y0
  606.         mov     si,X0
  607.         mov     di,si
  608.         dec     si
  609. @@ctri_lt_loop:
  610.         inc     cx      ; Y
  611.  
  612.         add     ax,DP02 ; PL,DP02
  613.         jle     short @@ctri_lt_shortl
  614.         sub     ax,DY02 ; PL,DY02
  615.         inc     si      ; XL
  616. @@ctri_lt_shortl:
  617.         add     si,XA02 ; XL,XA02
  618.  
  619.         add     bx,DP01 ; PS,DP01
  620.         jle     short @@ctri_lt_shortr
  621.         sub     bx,DY01 ; PS,DY01
  622.         inc     di      ; XS
  623. @@ctri_lt_shortr:
  624.         add     di,XA01 ; XS,XA01
  625.  
  626.         push    si      ; XL
  627.         push    di      ; XS
  628.         cmp     cx,Y1   ; Y,Y1
  629.         jl      short @@ctri_lt_loop
  630.  
  631.         jmp     short @@ctri_lb_start
  632. @@ctri_lb_loop:
  633.         inc     cx      ; Y
  634.  
  635.         add     ax,DP02 ; PL,DP02
  636.         jle     short @@ctri_lb_shortl
  637.         sub     ax,DY02 ; PL,DY02
  638.         inc     si      ; XL
  639. @@ctri_lb_shortl:
  640.         add     si,XA02 ; XL,XA02
  641.  
  642.         add     bx,DP12 ; PS,DP12
  643.         jle     short @@ctri_lb_shortr
  644.         sub     bx,DY12 ; PS,DY12
  645.         inc     di      ; XS
  646. @@ctri_lb_shortr:
  647.         add     di,XA12 ; XS,XA12
  648.  
  649.         push    si      ; XL
  650.         push    di      ; XS
  651. @@ctri_lb_start:
  652.         cmp     cx,Y2   ; Y,Y2
  653.         jl      @@ctri_lb_loop
  654.         jmp     short @@ctri_draw_lines
  655.  
  656. ; short sides are on the right
  657. ;
  658. @@ctri_pt1rt:
  659.         mov     ax,0    ; PL <- 0
  660.         mov     bx,0    ; PS <- 0
  661.         mov     cx,Y0   ;  Y <- Y0
  662.         mov     si,X0
  663.         mov     di,si
  664.         dec     di
  665. @@ctri_rt_loop:
  666.         inc     cx      ; Y
  667.  
  668.         add     ax,DP02 ; PL,DP02
  669.         jle     short @@ctri_rt_shortl
  670.         sub     ax,DY02 ; PL,DY02
  671.         inc     si      ; XL
  672. @@ctri_rt_shortl:
  673.         add     si,XA02 ; XL,XA02
  674.  
  675.         add     bx,DP01 ; PS,DP01
  676.         jle     short @@ctri_rt_shortr
  677.         sub     bx,DY01 ; PS,DY01
  678.         inc     di      ; XS
  679. @@ctri_rt_shortr:
  680.         add     di,XA01 ; XS,XA01
  681.  
  682.         push    di      ; XS
  683.         push    si      ; XL
  684.         cmp     cx,Y1   ; Y,Y1
  685.         jl      short @@ctri_rt_loop
  686.  
  687.         jmp     short @@ctri_rb_start
  688. @@ctri_rb_loop:
  689.         inc     cx      ; Y
  690.  
  691.         add     ax,DP02 ; PL,DP02
  692.         jle     short @@ctri_rb_shortl
  693.         sub     ax,DY02 ; PL,DY02
  694.         inc     si      ; XL
  695. @@ctri_rb_shortl:
  696.         add     si,XA02 ; XL,XA02
  697.  
  698.         add     bx,DP12 ; PS,DP12
  699.         jle     short @@ctri_rb_shorts
  700.         sub     bx,DY12 ; PS,DY12
  701.         inc     di      ; XS
  702. @@ctri_rb_shorts:
  703.         add     di,XA12 ; XS,XA12
  704.  
  705.         push    di      ; XS
  706.         push    si      ; XL
  707. @@ctri_rb_start:
  708.         cmp     cx,Y2   ; Y,Y2
  709.         jl      short @@ctri_rb_loop
  710.  
  711. ; Draw the horizontal lines
  712. ;
  713. @@ctri_draw_lines:
  714.         pop     ax
  715.         pop     dx
  716.         cmp     ax,dx
  717.         jg      @@ctri_draw_next
  718.         mov     bx,COLOR
  719.         mov     cx,Y2
  720.         call    far ptr _HLineClipR
  721. @@ctri_draw_next:
  722.         dec     word ptr Y2
  723.         dec     word ptr DY02
  724.         jnz     @@ctri_draw_lines
  725.  
  726. @@ctri_done:
  727.         pop     di
  728.         pop     si
  729.         pop     ds
  730.         mov     sp,bp
  731.         pop     bp
  732.         ret
  733. _TriangleFillClip       endp
  734.  
  735.  
  736. END